package com.edu.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

import java.util.Date;

/**
 * SpringAOP 通知类 不需要额外实现任何接接口
 */
public class MyAspect {

    /**
     *  前置通知的方法中，可以加入一个 参数 JoinPoint 表示连接点
     */
    public void before(JoinPoint jt){
//        System.out.println("被强化的对象是:"+jt.getTarget());
//        System.out.println("被强化的方法是:"+jt.getSignature().getName());
//        System.out.println(jt.getArgs().length);
        System.out.println("执行了 MyAspect里的前置通知 执行时间1:"+new Date());

        //如果没有登录 就执行下属代码
//        throw new RuntimeException("用户未登录");
    }

    /**
     * 后置返回通知 被增强的方法执行完毕之后 执行
     * @param jt
     * @param result
     */
    public void afterReturn(JoinPoint jt,Object result){
        System.out.println(result);
        result = 2;
        System.out.println("执行了 后置返回通知");
    }

    /**
     *  被增强的方法 抛出异常时
     *      Jt 可以表示连接点
     *      e 用于接收 业务方法抛出的异常对象
     */
    public void afterThrowing(JoinPoint jt,Exception e){
        System.out.println(jt.getSignature().getName()+"执行过程中发生了异常:"+"执行了异常通知"+e);
    }

    /**
     *  当业务方法执行完毕后（无论是否发生异常） 都要执行
     * @param jt
     */
    public void after(JoinPoint jt){
        System.out.println("执行了后置通知");
    }

    /**
     * ProceedingJoinPoint 代表了 呗增强的那个方法
     *  可以使用pjt 来执行 业务方法 本来的功能
     * @param pjt
     */
    public Object round(ProceedingJoinPoint pjt) throws Throwable {
        System.out.println("环绕通知的 前置处理");
        Object result = pjt.proceed();// 执行原本的业务方法，返回值业务方法的返回值
        System.out.println("环绕通知的后置处理");
        return result;
    }
}
